﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace BasicForms
{
    public partial class FrmWarning : BasicForms.FrmBase
    {
        private static int _NumberOfReIndex = 0;
        private static FrmWarning singletonForm = null;
        public static FrmWarning Instance(string title, string message)
        {
            if(singletonForm==null)
            {
                singletonForm = new FrmWarning(title, message);
            }
            else
            {
                singletonForm.Close();
                singletonForm = new FrmWarning(title, message);
            }

            return singletonForm;
        }

        #region Title property
        private string _Title;
        public string Title
        {
            get
            {
                return _Title;
            }
            set
            {
                _Title = value;
            }
        }
        #endregion

        #region Message property
        private string _Message;
        public string Message
        {
            get
            {
                return _Message;
            }
            set
            {
                _Message = value;
            }
        }
        #endregion

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            try
            {
                switch (keyData)
                {
                    case Keys.Enter:
                        this.Close();
                        break;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public FrmWarning(string title, string message)
        {
            InitializeComponent();
            this.Text = title;

            this.txtMessage.EditValue = message;
        }

        public static void Show(string title, string message)
        {
            FrmWarning.Instance(title, message);
            singletonForm.ShowDialog();
            if(message.ToUpper().Contains("TIMEOUT" )|| message.ToUpper().Contains("TIME OUT")) //Có thể do lỗi chỉ mục
            {
                //if (_NumberOfReIndex < 1) //Nếu chưa đánh lại lần nào. Đã đánh rồi thì có thể k phải do lỗi này. K nên thực hiện nhiều lần
                //{
                //    if (MessageBox.Show("Sự cố có thể do chỉ mục của CSDL bị sự cố.\nBạn có muốn chương trình tự động đánh lại chỉ mục không?",
                //        "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Hand) == DialogResult.Yes)
                //    {
                //        ReIndexDB();
                //    }
                //}
            }
        }
        private static void ReIndexDB()
        {
            _NumberOfReIndex++;
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandTimeout = 1000 * 10;

                cmd.CommandText = string.Format("DECLARE @MyTable VARCHAR(255) \n" +
                                                "DECLARE myCursor CURSOR FOR \n" +
                                                "   SELECT table_name \n" +
                                                "   FROM information_schema.tables \n" +
                                                "   WHERE table_type = 'base table' \n" +
                                                "OPEN myCursor \n" +
                                                "FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "WHILE @@FETCH_STATUS = 0 \n" +
                                                "BEGIN \n" +
                                                "   PRINT 'Reindexing Table:  ' + @MyTable \n" +
                                                "   DBCC DBREINDEX(@MyTable, '', 80) \n" +
                                                "   FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "END \n" +
                                                "CLOSE myCursor \n" +
                                                "DEALLOCATE myCursor \n" +
                                                "EXEC sp_updatestats \n"
                                                );
                BasicForms.FrmProgressBarDev.StartShowProgress("Đang đánh lại chỉ mục cho các bảng trong CSDL để tăng tốc độ truy vấn");
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Show("Thông báo", "Gặp sự cố khi đánh lại chỉ mục cho các bảng trong CSDL");
            }
            finally
            {
                BasicForms.FrmProgressBarDev.FinishShowProgress();
                if (con.State == ConnectionState.Open) con.Close();
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
